from django.shortcuts import render
from django.http import HttpResponse
import logging
import random
from django.views import View
from django_redis import get_redis_connection
from virefy.yuntongxun.sms import CCP
from virefy.active_time import SMS_CODE_EXPIRES,SMS_CODE_TEMP_ID
from virefy.captcha.captcha import captcha
from user.models import User
from virefy.json_res import json_response
from  virefy.forms import CheckInmage

from virefy.res_code import Code
# Create your views here.



# 初始化，实例化log日志器
logger=logging.getLogger("django")
# 定义日志器接收等级
logger.setLevel(logging.DEBUG)
#定义日志器输出的方式
sh=logging.StreamHandler()
#定义输出的等级
sh.setLevel(logging.INFO)
#定义输出的格式
formater=logging.Formatter(
    '时间:%(asctime)s'
    '等级:%(levelname)s'
    '错误信息:%(message)s'
)
#输出方式的格式
sh.setFormatter(formater)
#将输出方式于日志器建立联系
logger.addHandler(sh)


def image_code(request):
    text,image=captcha.generate_captcha()
    logger.info("图片验证码{}".format(text))
    #设置session
    request.session["image_code"]=text
    #设置session过期时间
    request.session.set_expiry(30)
    return HttpResponse(content=image,content_type="image/jpg")


#判断用户是否注册
def check_username_view(request,username):
    data={
        'username':username,
        'count':User.objects.filter(username=username).count()
    }
    return json_response(data=data)

#判断手机号是否注册
def check_mobile_view(request,mobile):
    data={
        "mobile":mobile ,
        "count":User.objects.filter(mobile=mobile).count(),
    }
    return json_response(data=data)

#判断图片验证码
# def check_image_view(request):
#     text=request.session.get("image_code")
#     print(text)
#     data={
#         "image_code":text,
#     }
#     return json_response(data=data)

#手机号注册
class SmsCode(View):
    def post(self,request):
        form=CheckInmage(request.POST,request=request)
        print(request.POST)
        #校验forms表单数据是否合法
        if form.is_valid():
            # 筛选forms表单字段的数据
            print("验证OK")
            mobile=form.cleaned_data.get("telephone")
            #随机生成验证码
            sms_code=''.join([random.choice('0123456789') for _ in range(4)])#列表推导式，生成4位验证码
            #发送验证码
            ccp=CCP()
            try:
                res = ccp.send_template_sms(mobile,[sms_code,5], '1')
                if res==0:
                    logger.info("发送短信验证码[正常],%s sms_code=%s"%(mobile,sms_code))
                    print("发送短信验证码[正常],%s sms_code=%s"%(mobile,sms_code))
                else:
                    logger.error("发送短信验证码[失败],%s sms_code=%s"%(mobile,sms_code))
                    return json_response(errno=Code.SMSFAIL, errmsg=Code.SMSFAIL)
            except Exception as e:
                logger.error("发送短信验证码[异常],%s error=%s"%(mobile,e))
                return json_response(errno=Code.SMSERROR, errmsg=Code.SMSERROR)
            #保存验证码
            #保存发送记录
            sms_flag_key='sms_flag_{}'.format(mobile)
            sms_text_key='sms_text_{}'.format(mobile)
            #连接redis数据库
            redis_conn=get_redis_connection(alias='default')#alias指定与那个库进行连接
            pl=redis_conn.pipeline()
            #管道控制 pl
            #管道django自带有，不需要导入
            try:
                pl.setex(sms_flag_key,60,mobile)
                pl.setex(sms_text_key,360,sms_code)
                #执行管道命令
                pl.execute()
                # print(redis_conn.get('sms_text_{}'.format(mobile)).decode('utf-8'))
                logger.info("短信验证码发送成功")
                return json_response(errmsg="短信验证码发送成功")
            except Exception as e:
                logger.error('保存短信验证码失败{}'.format(e))
                return json_response(errno=Code.UNKOWNERR,errmsg=Code.UNKOWNERR)
        else:
            #数据校验不通过
            error_list=[]
            for item in form.errors.get_json_data().values():
                error_list.append(item[0].get('message'))
            error_msg_str='/'.join(error_list)
            return json_response(errno=Code.PARAMERR,errmsg=error_msg_str)


